package com.common.util;

import com.common.vo.BusinessPriceVO;
import org.springframework.util.ResourceUtils;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;


public class EmailUtil {
    //信息回调
    public interface Callback {

        void success(String s);

        void error(String s, Exception e);
    }

    private Callback callback;  //信息回调接口
    private Properties properties;//系统属性对象
    private String mailAccount;   //发送邮箱地址
    private String mailPassword;  //验证密码
    private Session session;      //邮件会话对象
    private String myNickName;    //昵称，发送时自己的昵称
    private boolean debug = false;//debug模式

    public EmailUtil(String mailAccount, String mailPassword) {
        this.mailAccount = mailAccount;
        this.mailPassword = mailPassword;
    }

    private List<String> recipientT0List = new ArrayList<>();//收件地址
    private List<String> recipientCCList = new ArrayList<>();//密送地址
    private List<String> recipientBCCList = new ArrayList<>();//抄送地址
    private List<String> filePath = new ArrayList<>();//附件
    private MimeMessage message;

    /**
     * @param
     */
    /* 发送验证信息的邮件 */
    public static boolean sendMail(String userName, String advCode, String result,  String[] emails) {
        try {
            //连接邮件服务器参数配置
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            //163邮箱,则使用 smtp.163.com
            //qq邮箱 则使用smtp.qq.com
            //腾讯企业邮箱 则使用 smtp.exmail.qq.com
            props.put("mail.smtp.host", "smtp.exmail.qq.com");
            // 发件人的账号
            props.put("mail.user", "mxh@pinxiaocm.com");
            //发件人的密码
            props.put("mail.password", "Authen666");

            // 构建授权信息，用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息，创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);

            // 批量设置收件人
            InternetAddress[] sendTo = new InternetAddress[emails.length];
            for (int i = 0; i < emails.length; i++) {
                System.out.println("发送到:" + emails[i]);
                sendTo[i] = new InternetAddress(emails[i]);
            }
            message.setRecipients(Message.RecipientType.TO, sendTo);
            // 设置邮件标题
            message.setSubject(userName + "有素材不允许播放操作反馈");

            // 设置邮件的内容体
            message.setContent(userName+"有不允许播放的素材→广告编号："+advCode+
                    "！\n   处理结果："+result, "text/html;charset=UTF-8");

            // 发送邮件
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }

    /**
     * @param
     */
    /* 发送验证信息的邮件 */
    public static boolean sendBusinessPriceMail(BusinessPriceVO businessPriceVO,String[] emails) {
        try {
            //连接邮件服务器参数配置
            final Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            //163邮箱,则使用 smtp.163.com
            //qq邮箱 则使用smtp.qq.com
            //腾讯企业邮箱 则使用 smtp.exmail.qq.com
            props.put("mail.smtp.host", "smtp.exmail.qq.com");
            // 发件人的账号
            props.put("mail.user", "mxh@pinxiaocm.com");
            //发件人的密码
            props.put("mail.password", "Authen666");

            // 构建授权信息，用于进行SMTP进行身份验证
            Authenticator authenticator = new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    // 用户名、密码
                    String userName = props.getProperty("mail.user");
                    String password = props.getProperty("mail.password");
                    return new PasswordAuthentication(userName, password);
                }
            };
            // 使用环境属性和授权信息，创建邮件会话
            Session mailSession = Session.getInstance(props, authenticator);
            // 创建邮件消息
            MimeMessage message = new MimeMessage(mailSession);
            // 设置发件人
            String username = props.getProperty("mail.user");
            InternetAddress form = new InternetAddress(username);
            message.setFrom(form);

            // 批量设置收件人
            InternetAddress[] sendTo = new InternetAddress[emails.length];
            for (int i = 0; i < emails.length; i++) {
                System.out.println("发送到:" + emails[i]);
                sendTo[i] = new InternetAddress(emails[i]);
            }
            message.setRecipients(Message.RecipientType.TO, sendTo);
            // 设置邮件标题
            message.setSubject("插入自主价数据失败");

            // 设置邮件的内容体
            message.setContent(businessPriceVO.toString(), "text/html;charset=UTF-8");
            // 发送邮件
            Transport.send(message);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }


    /**
     * 创建一封复杂邮件（文本+图片+附件）
     */
    public static MimeMessage createMimeMessage(Session session, String sendMail, String receiveMail, String userName) throws Exception {
        // 1. 创建邮件对象
        MimeMessage message = new MimeMessage(session);

        // 2. From: 发件人
        message.setFrom(new InternetAddress(sendMail, "mxh", "UTF-8"));

        // 3. To: 收件人（可以增加多个收件人、抄送、密送）
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(receiveMail, userName, "UTF-8"));

        // 4. Subject: 邮件主题
        message.setSubject("恭喜您已成功注册成为品效传媒用户！", "UTF-8");

        /*
         * 下面是邮件内容的创建:
         */
        //  显示图片必须为related，如果还需要添加附件必须为multi
        //  邮件内容

        // 5. 创建图片“节点”
        // 5. 创建图片“节点”
        MimeBodyPart image = new MimeBodyPart();
        File file = ResourceUtils.getFile("classpath:static/user/img/email/pxcmAdvertising.png");
        File file1 = ResourceUtils.getFile("classpath:static/user/img/email/pxcmDisplayShow.png");
        DataSource source = new FileDataSource(file);
        DataSource dadaSource = new FileDataSource(file1);
        DataHandler dh = new DataHandler(source); // 读取本地文件
        image.setDataHandler(dh);                   // 将图片数据添加到“节点”
        image.setContentID("image_Advertising");     // 为“节点”设置一个唯一编号（在文本“节点”将引用该ID）
        MimeBodyPart image1 = new MimeBodyPart();
        DataHandler dh1 = new DataHandler(dadaSource); // 读取本地文件
        image1.setDataHandler(dh1);                   // 将图片数据添加到“节点”
        image1.setContentID("image_DisplayShow");
        // 6. 创建文本“节点”
        MimeBodyPart text = new MimeBodyPart();
//            这里添加图片的方式是将整个图片包含到邮件内容中, 实际上也可以以 http 链接的形式添加网络图片
        text.setContent(
                "<div style=''>" +
                        "<ul style='list-style:none;'>" +
                        "<li>尊敬的客户，您好！</li>" +
                        "<li style='line-height:35px; text-indent:30px;'>恭喜您成为品效传媒的注册用户！</li>" +
                        "<li style='text-indent:30px;'>我是您的专属服务顾问马小华，您在使用中有任何需要，欢迎随时与我联系，我的邮箱为mxh@pinxiaocm.com。</li>" +
                        "<li style='line-height:35px;'>品效传媒赠送您1万次免费海报广告投放机会，请尽快登录您的会员账户领取！</li>" +
                        "<li style='text-indent:30px;'>海报广告说明如下：</li>" +
                        "<li ><img src='cid:image_DisplayShow'/></li>" +
                        "<li style='line-height:35px;text-indent:30px;'>请登录品效官网并根据下图的引导完成免费投放申请</li>" +
                        "<li style=''><img src='cid:image_Advertising'/></li>" +
                        "<li style='line-height:35px;text-indent:30px;'>为确保顺利播放，我们将对您提交的资料进行审核，审核结果我会以邮件的形式发送给您，请注意查收。</li>" +
                        "<li style='text-indent:30px;'>附件是网站使用说明文件，请查收，谢谢</li>" +
                        "<li style='line-height:35px;text-indent:30px;'>祝您投放顺利！</li>" +
                        "<li style='text-indent:30px;'>您的专属服务顾问   马小华</li>" +
                        "<li style='line-height:35px;text-indent:30px'>电话：0769-26622382</li>" +
                        "</ul>" +
                        "</div>"
                , "text/html;charset=UTF-8");

        // 7. （文本+图片）设置 文本 和 图片 “节点”的关系（将 文本 和 图片 “节点”合成一个混合“节点”）
        MimeMultipart mm_text_image = new MimeMultipart();
        mm_text_image.addBodyPart(image);
        mm_text_image.addBodyPart(image1);
        mm_text_image.addBodyPart(text);
        mm_text_image.setSubType("related");    // 关联关系

        // 8. 将 文本+图片 的混合“节点”封装成一个普通“节点”
        //    最终添加到邮件的 Content 是由多个 BodyPart 组成的 Multipart, 所以我们需要的是 BodyPart,
        //    上面的 mm_text_image 并非 BodyPart, 所有要把 mm_text_image 封装成一个 BodyPart
        MimeBodyPart text_image = new MimeBodyPart();
        text_image.setContent(mm_text_image);

        // 9. 创建附件“节点”

//        MimeBodyPart attachment = new MimeBodyPart();
//        DataHandler dh2 = new DataHandler(new FileDataSource(ResourceUtils.getFile("classpath:static/user/img/email/pxcmDisplayShow.png")));  // 读取本地文件
//        attachment.setDataHandler(dh2);                                             // 将附件数据添加到“节点”
//        attachment.setFileName(MimeUtility.encodeText(dh2.getName()));              // 设置附件的文件名（需要编码）

        // 10. 设置（文本+图片）和 附件 的关系（合成一个大的混合“节点” / Multipart ）
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text_image);
     //   mm.addBodyPart(attachment);     // 如果有多个附件，可以创建多个多次添加
        mm.setSubType("mixed");         // 混合关系

        // 11. 设置整个邮件的关系（将最终的混合“节点”作为邮件的内容添加到邮件对象）
        message.setContent(mm);

        // 12. 设置发件时间
        message.setSentDate(new Date());

        // 13. 保存上面的所有设置
        message.saveChanges();

        return message;
    }
}
